// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Engine/CancellableAsyncAction.h"
#include "UObject/WeakInterfacePtr.h"

#include "AsyncAction_ObserveTeamColors.generated.h"

class ILyraTeamAgentInterface;
class ULyraTeamDisplayAsset;
struct FFrame;

/**
 * 观察团队颜色变化的异步委托，包含三个参数：是否设置了团队、团队ID和显示资源
 */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FTeamColorObservedAsyncDelegate, bool, bTeamSet, int32, TeamId, const ULyraTeamDisplayAsset*, DisplayAsset);

/**
 * 监视指定对象中的团队颜色变化
 */
UCLASS()
class UAsyncAction_ObserveTeamColors : public UCancellableAsyncAction
{
	GENERATED_UCLASS_BODY()

public:
	/**
	 * 监视指定团队代理的团队变化
	 *  - 会立即触发一次以提供当前团队分配
	 *  - 对于任何可以属于团队的对象（实现ILyraTeamAgentInterface接口），
	 *    它还会监听未来的团队分配变化
	 */
	UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly="true", Keywords="Watch"))
	static UAsyncAction_ObserveTeamColors* ObserveTeamColors(UObject* TeamAgent);

	//~UBlueprintAsyncActionBase接口
	virtual void Activate() override; // 激活异步操作
	virtual void SetReadyToDestroy() override; // 设置准备销毁
	//~UBlueprintAsyncActionBase接口结束

public:
	// 当团队被设置或更改时调用
	UPROPERTY(BlueprintAssignable)
	FTeamColorObservedAsyncDelegate OnTeamChanged; // 团队变化委托

private:
	/**
	 * 广播团队变化
	 */
	void BroadcastChange(int32 NewTeam, const ULyraTeamDisplayAsset* DisplayAsset);

	/**
	 * 当监视的代理团队变化时调用
	 */
	UFUNCTION()
	void OnWatchedAgentChangedTeam(UObject* TeamAgent, int32 OldTeam, int32 NewTeam);

	/**
	 * 当显示资源变化时调用
	 */
	UFUNCTION()
	void OnDisplayAssetChanged(const ULyraTeamDisplayAsset* DisplayAsset);

	TWeakInterfacePtr<ILyraTeamAgentInterface> TeamInterfacePtr; // 团队接口弱指针
	TWeakObjectPtr<UObject> TeamInterfaceObj; // 团队接口对象弱指针

	int32 LastBroadcastTeamId = INDEX_NONE; // 最后广播的团队ID
};